package savet.gui.util;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Enumeration;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**
 *
 * @author Gomes
 */
public final class JTableUtil {

    /**
     * Cria um menu popup para um {@link JTable}. A funcionalidade para esse menu popup
     * &eacute; ocultar e exibir colunas da tabela.<br/>
     * Cada item do menu e uma coluna da tabela com {@link JCheckBoxMenuItem}.
     *
     * @param table
     */
    public static void criarMenuPopup(JTable table) {
        final JPopupMenu popupMenu = new JPopupMenu("Colunas...");
        final TableColumnModel columnModel = table.getColumnModel();
        final Enumeration<TableColumn> columns = columnModel.getColumns();

        table.setComponentPopupMenu(popupMenu);
        while (columns.hasMoreElements()) {

            final TableColumn coluna = columns.nextElement();
            final String idColuna = coluna.getIdentifier().toString();
            final int index = columnModel.getColumnIndex(idColuna);

            if (index > 0) {
                JCheckBoxMenuItem item = new JCheckBoxMenuItem(idColuna, true);
                item.setName(idColuna);
                item.addItemListener(new ItemListener() {

                    /** Indice da coluna para ser adicionada posteriormente*/
                    private int indexColuna = index;
                    /** Modelo da coluna para ser adicionada posteriormente */
                    private TableColumn col = coluna;

                    public void itemStateChanged(ItemEvent e) {

                        JComponent c = (JComponent) e.getSource();

                        if (e.getStateChange() == ItemEvent.DESELECTED) {
                            System.out.println(c.getName() + " desabilitado");
                            // remove a coluna da tabela
                            columnModel.removeColumn(col);
                        } else {
                            System.out.println(c.getName() + " habilitado");
                            // adiciona a coluna da tabela e a posiciona corretamente
                            columnModel.addColumn(col);
                            columnModel.moveColumn(columnModel.getColumnCount() - 1, indexColuna);
                        }
                    }
                });
                popupMenu.add(item);
            }
        }
    }
}
